#include "funcionesFAT32.h"
#include "interfazFUSE.h"
#include "protocolo_NIPC.h"
#include "archivo_Configuracion.h"
#include "consolaFS.h"
#include "cache.h"
#include <netinet/tcp.h>
#include <fcntl.h>

key_t claveSem;
static struct fuse_operations FS_funciones = {

.create = FS_create,
.open = FS_open,
.read = FS_read,
.write = FS_write,
.flush = FS_flush,
.release = FS_release,
.truncate = FS_truncate,
//.ftruncate = FS_truncate,
.unlink = FS_unlink,
.mkdir = FS_mkdir,
.readdir = FS_readdir,
.rmdir = FS_rmdir,
//.fgetattr = FS_fgetattr,
.getattr = FS_getattr,
.rename = FS_rename,

};
void inicializar();

void inicializar(void){


	abrirConfig();

	int conexiones;

	struct sockaddr_in data;
	data.sin_family = AF_INET;
	data.sin_addr.s_addr = inet_addr(ip);
	data.sin_port = htons((puerto));
	int sock = 0;

	iniciarSocket(&sock);
	int numero = 0;


	conectarSocket(&sock,data);

	char buffHandShake[1024];
	memset(buffHandShake,0,1024);
	char op=0; uint16_t res=1;

	memcpy(buffHandShake,&op,sizeof(uint8_t));
	memcpy(buffHandShake+sizeof(uint8_t),&op,sizeof(uint16_t));

	enviarDatos(buffHandShake,3,sock);

	memset(buffHandShake,0,1024);

	recv(sock,buffHandShake,3,MSG_WAITALL);
	//recibirDatos(buffHandShake,sock);
	
	memcpy(&res,buffHandShake+sizeof(uint8_t),sizeof(uint16_t));

	if(res==0){
		sleep(2);
		printf("handShake exitoso\n");

		vectorSocket=malloc(sizeof(int)*cantConexiones);
		conexiones=0;
		vectorSocket[conexiones]=sock;
		conexiones=1;

		while(conexiones<cantConexiones){
			sock=0;
			iniciarSocket(&sock);
			conectarSocket(&sock,data);
			memcpy(buffHandShake,&op,sizeof(uint8_t));
				memcpy(buffHandShake+sizeof(uint8_t),&op,sizeof(uint16_t));

				enviarDatos(buffHandShake,3,sock);

				memset(buffHandShake,0,1024);

				recv(sock,buffHandShake,3,MSG_WAITALL);

				memcpy(&res,buffHandShake+sizeof(uint8_t),sizeof(uint16_t));
				if(res==0)
			vectorSocket[conexiones]=sock;
				else break;
				sock=0;
				conexiones++;
 		}
		maxConec=0;
		claveSem=ftok("/bin/ls",76);
		//semSock=inicia(cantConexiones, claveSem);

		mutexSock=inicia(1, IPC_PRIVATE);

	}
	mutexbitV=inicia(1, IPC_PRIVATE);
	mutexFAT=inicia(1, IPC_PRIVATE);
	sleep(2);

	return ;
}




int main(int argc,char* argv[]){
		printf("----------------------------------------------------------------------------\n");
		printf("*********---------------- PROCESO FILE SYSTEM -----------------*************\n");
		printf("********    Tp Operativos: Fuselage  --  2do Cuatrimestre  2011    *********\n");
		printf("----------------------------------------------------------------------------\n\n");
		
		logfs = log_create("PFS", "log.txt", DEBUG | INFO, M_CONSOLE_DISABLE);
		inicializar();
		leer_Boot_Sector();
		bajar_datos_Cluster_FAT();
		//cachePrincipal();
		sem1=ftok("/bin/ls",80);
		sem=inicia(1,sem1);
		//system("sudo umount /tmp/fuse");

		int argc_fuse = 3;
		char *argv_fuse[] = {"NULL","/home/utn_so/fuse","-d"};

	    fuse_main(argc_fuse,argv_fuse,&FS_funciones,NULL);
	    consola ();
		return 0;
}
